package com.dxf.chepter09

/**
 * 样例类 即 即 模板
 *
 *  1  样例类 对象不用 new,可以直接 类名()创建 -->底层会调用apply方法创建对象
 *
 *  2 样例类也是类,只是多带一些样例的方法
 *
 *
 *
 *
 *
 */
object T117_样例类_模板_基本介绍 {


  def main(args: Array[String]): Unit = {
    // 可以通过对象匹配得到样例类对象的属性值
    //    for(amt <- Array(Dollar(1000.0),Currecy(500.0,"RMB"),NoAmount)){
    //      val result = amt match {
    //        case Dollar(v) => "$"+v
    //        case Currecy(v,u) => v+u
    //        case NoAmount => ""
    //        case _ =>None
    //      }
    //      println(result)
    //    }


    val amt = new Currecy(3000.0, "RMB")
    val amt2: Currecy = amt.copy() //克隆,创建的对象amt2 的属性值和amt一样
    println(amt, amt2)
    println(amt.value, amt2.value)

    val amt3 = amt.copy(8000.0)
    val amt4 = amt.copy(8000.0,"$")
    println(amt3,amt4)


  }

}

/**
 *  Dollar   Currecy  NoAmount 是样例类
 *
 *  样例类可是是 类 class 也可以是 object 对象
 *
 *
 *
 *   1 样例类任然是类
 *   2 样例类用 case 关键字声明
 *   3 样例类是为模板匹配而优化的类
 *   4 构造器中的每一个参数默认是 val 除非被声明 var    case class Dollar(value:Double)  --->  case class Dollar( var value:Double)
 *   5 样例类对应的伴生对象中提供apply方法,让你不同new 关键字就能构造出对象
 *   6 提供unapply() 方法让模式匹配可以工作
 *   7 将自动生成 toString,equals,hashCode和copy 方法
 *   8 样例类除了以上和其他类完全一样
 */
abstract class Amount

case class Dollar(value: Double) extends Amount

case class Currecy(value: Double, unit: String) extends Amount

case object NoAmount extends Amount




